package storeapi

import (
	"fmt"
	"pardon110/mogdb_restful/httputil"
	"pardon110/mogdb_restful/store"

	"github.com/kataras/iris/v12"
)

// MovieHandler 实现movieService类型的值
type MovieHandler struct {
	service store.MovieService
}

// NewMovieHandler 实例化
func NewMovieHandler(service store.MovieService) *MovieHandler {
	return &MovieHandler{service: service}
}

// GetAll 扩展接口实现
func (h *MovieHandler) GetAll(ctx iris.Context) {
	movies, err := h.service.GetAll(nil)
	if err != nil {
		httputil.InternalServerErrorJSON(ctx, err, "服务端不能取回所有的电影资料")
		return
	}
	if movies == nil {
		// 初始化生成一个store.Movie切片类型
		movies = make([]store.Movie, 0)
	}
	ctx.JSON(movies)
}

// Get 获取参数
func (h *MovieHandler) Get(ctx iris.Context) {
	id := ctx.Params().Get("id")

	m, err := h.service.GetByID(nil, id)
	if err != nil {
		if err == store.ErrNotFound {
			ctx.NotFound()
		} else {
			httputil.InternalServerErrorJSON(ctx, err, "服务器不能读取电影 [%s]", id)
		}
		return
	}
	ctx.JSON(m)
}

// Add 增加
func (h *MovieHandler) Add(ctx iris.Context) {
	m := new(store.Movie)

	err := ctx.ReadJSON(m)
	if err != nil {
		httputil.FailJSON(ctx, iris.StatusBadRequest, err, "请求数据不完整")
		return
	}

	err = h.service.Create(nil, m)
	if err != nil {
		httputil.InternalServerErrorJSON(ctx, err, "服务端不能添加新电影")
		return
	}
	ctx.StatusCode(iris.StatusCreated)
	ctx.JSON(m)
}

// Update 更新
func (h *MovieHandler) Update(ctx iris.Context) {
	id := ctx.Params().Get("id")

	var m store.Movie
	err := ctx.ReadJSON(&m)
	if err != nil {
		httputil.FailJSON(ctx, iris.StatusBadRequest, err, fmt.Sprintf("请求数据不完整,%s", err.Error()))
		return
	}

	err = h.service.Update(nil, id, m)
	if err != nil {
		if err == store.ErrNotFound {
			ctx.NotFound()
			return
		}
		httputil.InternalServerErrorJSON(ctx, err, "不可更新电影 [%s]", id)
		return
	}
	ctx.JSON(m)

}

// Delete 删除
func (h *MovieHandler) Delete(ctx iris.Context) {
	id := ctx.Params().Get("id")

	err := h.service.Delete(nil, id)
	if err != nil {
		if err == store.ErrNotFound {
			ctx.NotFound()
			return
		}
		httputil.InternalServerErrorJSON(ctx, err, "不能删除电影 [%s]", id)
		return
	}
}
